package com.zch.zchrpc.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtils implements InvocationHandler {
    public ProxyUtils(Object target) {
        this.target = target;
    }
    //目标对象。也就是被代理对象
    private Object target;
    /**
     * 根据实现类
     * 获取他的接口，
     * 利用实现类的接口创建动态的代理类。
     * @return
     */
    public  <T> T getProxy(){
        // clazz不是接口不能使用JDK动态代理
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces() , ProxyUtils.this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("切面 开启事务……");
           //方法的反射。调用被代理对象开始真正执行。在这一步开始真正的调用目标对象的方法。
           Object result= method.invoke(target,args);
        System.out.println("切面 关闭事务……");
       return result;
    }
}
